use crate::mio_uds_windows::{UnixListener, UnixStream};
use mio::{Events, Poll, PollOpt, Ready, Token};
use tempfile::Builder;
use TryWrite;

const LISTEN: Token = Token(0);
const CLIENT: Token = Token(1);
const SERVER: Token = Token(2);

struct MyHandler {
    listener: UnixListener,
    connected: UnixStream,
    accepted: Option<UnixStream>,
    shutdown: bool,
}

#[test]
fn local_addr_ready() {
    let dir = Builder::new().prefix("uds").tempdir().unwrap();

    let server = UnixListener::bind(dir.path().join("foo")).unwrap();
    let addr = server.local_addr().unwrap();

    let poll = Poll::new().unwrap();
    poll.register(&server, LISTEN, Ready::readable(), PollOpt::edge())
        .unwrap();

    let sock = UnixStream::connect(&addr.as_pathname().unwrap()).unwrap();
    poll.register(&sock, CLIENT, Ready::readable(), PollOpt::edge())
        .unwrap();

    let mut events = Events::with_capacity(1024);

    let mut handler = MyHandler {
        listener: server,
        connected: sock,
        accepted: None,
        shutdown: false,
    };

    while !handler.shutdown {
        poll.poll(&mut events, None).unwrap();

        for event in &events {
            match event.token() {
                LISTEN => {
                    let sock = handler.listener.accept().unwrap().unwrap().0;
                    poll.register(&sock, SERVER, Ready::writable(), PollOpt::edge())
                        .unwrap();
                    handler.accepted = Some(sock);
                }
                SERVER => {
                    handler.accepted.as_ref().unwrap().peer_addr().unwrap();
                    handler.accepted.as_ref().unwrap().local_addr().unwrap();
                    handler
                        .accepted
                        .as_mut()
                        .unwrap()
                        .try_write(&[1, 2, 3])
                        .unwrap();
                    handler.accepted = None;
                }
                CLIENT => {
                    handler.connected.peer_addr().unwrap();
                    handler.connected.local_addr().unwrap();
                    handler.shutdown = true;
                }
                _ => panic!("unexpected token"),
            }
        }
    }
}
